home *** CD-ROM | disk | FTP | other *** search
- /*
- * help.c
- *
- * Opens help/settings window and handles events.
- * For yak.
- *
- * Martin W. Scott, 12-Sep-92.
- */
- #include <exec/types.h>
- #include <dos/dosextens.h>
- #include <graphics/gfxmacros.h>
- #include <libraries/commodities.h>
- #include <intuition/gadgetclass.h>
- #include <intuition/intuition.h>
- #include <libraries/gadtools.h>
- #include <proto/exec.h>
- #include <proto/dos.h>
- #include <proto/intuition.h>
- #include <proto/gadtools.h>
- #include <proto/graphics.h>
- #include <proto/commodities.h>
- #include <string.h>
-
- #include "yak.h"
- #include "hotkey_types.h"
- #include "popup.h"
- #include "version.h"
-
- #define CATCOMP_NUMBERS
- #include "yak_locale_strings.h"
-
- static struct Window *curwin;
-
- /* static protos */
- static void __regargs InitHelpGadget(UWORD num, LONG tagtype, LONG tagvalue);
- static void InitHelpGadgets(void);
- static void __regargs InitHotKeyGadget(UWORD num, LONG tagtype, LONG tagvalue);
- static void InitHotKeyGadgets(void);
- static void __regargs InitMiscGadget(UWORD num, LONG tagtype, LONG tagvalue);
- static void InitMiscGadgets(void);
- static void __regargs NewPattern(UWORD gdx, UWORD n, struct Gadget *gad);
- static BOOL ShowHelpWindow(void);
- static BOOL ShowHotKeyWindow(void);
- static BOOL ShowMiscWindow(void);
- static BOOL SwitchToHotkeyWindow(void);
- static BOOL SwitchToMiscWindow(void);
- static LONG HandleHelpIDCMP(void);
- static LONG HandleHotKeyIDCMP(void);
- static LONG HandleMiscIDCMP(void);
-
-
- /* menu numbers */
- #define LOAD 0
- #define SAVE 1
- #define HIDE 2
- #define QUIT 3
-
- /* initialise individual gadget in help window */
- static void __regargs
- InitHelpGadget(UWORD num, LONG tagtype, LONG tagvalue)
- {
- GT_SetGadgetAttrs(HelpGadgets[num], HelpWnd, NULL, tagtype, tagvalue, TAG_DONE);
- }
-
- /* initialise all gadgets */
- static void
- InitHelpGadgets(void)
- {
- UWORD i;
-
- for (i = 0; i < NUM_TOGGLES; i++)
- if (toggles[i].gadid != -1)
- InitHelpGadget(toggles[i].gadid,
- GTCB_Checked,
- toggles[i].pos);
-
- InitHelpGadget(GDX_ScrTONum, GTIN_Number, blanksecs);
- InitHelpGadget(GDX_MouseTONum, GTIN_Number, mblanksecs);
- InitHelpGadget(GDX_AutoPat, GTST_String, (LONG)patterns[YP_AUTOSCR_PAT].patstr);
- InitHelpGadget(GDX_ClickPat, GTST_String, (LONG)patterns[YP_CLICKSCR_PAT].patstr);
- InitHelpGadget(GDX_PopPat, GTST_String, (LONG)patterns[YP_POPWIN_PAT].patstr);
- InitHelpGadget(GDX_ClickWinPat, GTST_String, (LONG)patterns[YP_CLICKWIN_PAT].patstr);
- InitHelpGadget(GDX_ClickWinPat, GTCY_Active, qualifier);
- }
-
- /* show current window */
- BOOL
- ShowWindow(void)
- {
-
- if (curwin) /* already opened */
- {
- ScreenToFront(curwin->WScreen);
- WindowToFront(curwin);
- ActivateWindow(curwin);
- return TRUE;
- }
-
- if (SetupScreen())
- return FALSE;
-
- return ShowHelpWindow();
- }
-
-
-
- /* show our help window */
- static BOOL
- ShowHelpWindow(void)
- {
- InitGUI ();
-
- if (!OpenHelpWindow()) /* like the name says... */
- {
- InitHelpGadgets();
- wndsigflag = 1 << HelpWnd->UserPort->mp_SigBit;
- curwin = HelpWnd;
- return TRUE;
- }
- CloseDownScreen();
- return FALSE;
- }
-
- /* show our hotkey window */
- static BOOL
- ShowHotKeyWindow(void)
- {
- if (!OpenHotKeyWindow()) /* like the name says... */
- {
- InitHotKeyGadgets();
- wndsigflag = 1 << HotKeyWnd->UserPort->mp_SigBit;
- curwin = HotKeyWnd;
- return TRUE;
- }
- CloseDownScreen();
- return FALSE;
- }
-
- /* show our misc window */
- static BOOL
- ShowMiscWindow(void)
- {
- if (!OpenMiscWindow()) /* like the name says... */
- {
- InitMiscGadgets();
- wndsigflag = 1 << MiscWnd->UserPort->mp_SigBit;
- curwin = MiscWnd;
- return TRUE;
- }
- CloseDownScreen();
- return FALSE;
- }
-
-
- /* update windows position for next openings */
- void
- UpdateWindowsPosition (void)
- {
- HelpLeft = curwin->LeftEdge;
- WindowTop = curwin->TopEdge;
- }
-
-
- /* hide our window */
- void
- HideWindow(void)
- {
- if (curwin)
- {
- UpdateWindowsPosition();
- if (curwin == HelpWnd)
- CloseHelpWindow();
- else
- if (curwin == MiscWnd)
- CloseMiscWindow();
- else
- CloseHotKeyWindow();
-
- CloseDownScreen();
- wndsigflag = NULL;
- curwin = HelpWnd = HotKeyWnd = MiscWnd = NULL;
- }
- }
-
- /* switch from help window to hotkey window */
- static BOOL
- SwitchToHotkeyWindow(void)
- {
- HotKeyLeft = HelpWnd->LeftEdge;
- WindowTop = HelpWnd->TopEdge;
- CloseHelpWindow();
- return ShowHotKeyWindow();
- }
-
- /* switch from help window to misc window */
- static BOOL
- SwitchToMiscWindow(void)
- {
- MiscLeft = HelpWnd->LeftEdge;
- WindowTop = HelpWnd->TopEdge;
- CloseHelpWindow();
- return ShowMiscWindow();
- }
-
-
-
- /* handle pattern string-gadget */
- static void __regargs
- NewPattern(UWORD gdx, UWORD n, struct Gadget *gad)
- {
- char *newpatstr;
-
- newpatstr = GetString(gad);
- if (!InitPattern(newpatstr, n))
- {
- DisplayBeep(Scr);
- InitHelpGadget(gdx, GTST_String, (LONG)patterns[n].patstr);
- }
- }
-
- /* handle window events */
- LONG
- HandleIDCMP(void)
- {
- if (curwin == HelpWnd)
- return HandleHelpIDCMP();
- else
- if (curwin == MiscWnd)
- return HandleMiscIDCMP();
- else
- return HandleHotKeyIDCMP();
- }
-
- /* handle help window events */
- static LONG
- HandleHelpIDCMP(void)
- {
- struct IntuiMessage *msg;
- struct Gadget *gadget;
- ULONG class;
- UWORD code;
- LONG num;
-
- while (msg = GT_GetIMsg(HelpWnd->UserPort))
- {
- class = msg->Class;
- code = msg->Code;
- gadget = (struct Gadget *)msg->IAddress;
- GT_ReplyIMsg(msg);
-
- switch (class)
- {
- case CLOSEWINDOW:
- HideWindow();
- return HELP_OKAY;
-
- case GADGETUP:
- case GADGETDOWN:
- switch (gadget->GadgetID)
- {
- case GD_EditHotkeys:
- if (!SwitchToHotkeyWindow())
- PostError(getString(Couldnt_open_other_window_ERR));
- return HELP_OKAY;
-
- case GD_Miscellaneous:
- if (!SwitchToMiscWindow())
- PostError(getString(Couldnt_open_other_window_ERR));
- return HELP_OKAY;
-
- case GD_AutoPat:
- NewPattern(GDX_AutoPat, YP_AUTOSCR_PAT, gadget);
- break;
-
- case GD_ClickPat:
- NewPattern(GDX_ClickPat, YP_CLICKSCR_PAT, gadget);
- break;
-
- case GD_PopPat:
- NewPattern(GDX_PopPat, YP_POPWIN_PAT, gadget);
- break;
-
- case GD_ClickWinPat:
- NewPattern(GDX_ClickWinPat, YP_CLICKWIN_PAT, gadget);
- break;
-
- case GD_Hide:
- HideWindow();
- return HELP_OKAY;
-
- case GD_Quit:
- HideWindow();
- return HELP_QUIT;
-
- case GD_AutoCheck: /* toggle */
- autopoint ^= TRUE;
- break;
-
- case GD_AutoPopCheck: /* toggle */
- autopop ^= TRUE;
- break;
-
- case GD_KeyActCheck: /* toggle */
- keyactivate ^= TRUE;
- break;
-
- case GD_CTFCheck: /* toggle */
- clicktofront ^= TRUE;
- break;
-
- case GD_CTBCheck: /* toggle */
- clicktoback ^= TRUE;
- break;
-
- case GD_ScrCycleCheck: /* toggle */
- screencycle ^= TRUE;
- break;
-
- case GD_WildStarCheck: /* toggle */
- wildstar ^= TRUE;
- if (wildstar) WILDSTARON; else WILDSTAROFF;
- break;
-
- case GD_NoClickCheck: /* toggle */
- noclick ^= TRUE;
- SetClickDrive(noclick);
- break;
-
- case GD_ScrActCheck: /* toggle */
- scractivate ^= TRUE;
- break;
-
- case GD_RMBActCheck: /* toggle */
- rmbactivate ^= TRUE;
- break;
-
- case GD_MMBActCheck: /* toggle */
- mmbactivate ^= TRUE;
- break;
-
- case GD_ScrTONum:
- num = GetNumber(gadget);
- if (num >= 0) {
- blanksecs = num;
- blankcount = blanktimeout = blanksecs*10;
- } else {
- InitHelpGadget(GDX_ScrTONum, GTIN_Number, blanksecs);
- DisplayBeep(HelpWnd->WScreen);
- }
- break;
-
- case GD_MouseTONum:
- num = GetNumber(gadget);
- if (num >= 0) {
- mblanksecs = num;
- mblankcount = mblanktimeout = mblanksecs*10;
- } else {
- InitHelpGadget(GDX_MouseTONum, GTIN_Number, mblanksecs);
- DisplayBeep(HelpWnd->WScreen);
- }
- break;
-
- } /* switch (gadget->GadgetID) */
- break;
-
- case REFRESHWINDOW:
- GT_BeginRefresh(HelpWnd);
- HelpRender();
- GT_EndRefresh(HelpWnd, TRUE);
- break;
-
- case IDCMP_MENUPICK:
- while (code != MENUNULL)
- {
- struct MenuItem *item = ItemAddress(HelpMenus, code);
-
- switch (ITEMNUM(code))
- {
- case LOAD:
- LoadSettings();
- InitHelpGadgets();
- break;
- case SAVE:
- SaveSettings();
- break;
- case HIDE:
- HideWindow();
- return HELP_OKAY;
- case QUIT:
- HideWindow();
- return HELP_QUIT;
- }
- code = item->NextSelect;
-
- } /* while more menuchoices */
- break;
-
- } /* switch (class) */
-
- } /* while more messages */
-
- return HELP_OKAY;
- }
-
- /*******************************************************************************
- * HOTKEY SPECIFIC DATA/ROUTINES
- * perhaps move to another file?
- *******************************************************************************/
-
- /* prototypes */
- static struct Node *GetNode(struct List *lh, UWORD n);
- static UWORD GetNodeNum(struct List *lh, struct Node *node);
-
- /* external data */
- static YakHotKey *curhk;
- static UWORD curtype;
-
- /* get nth node in list - list MUST have >= n nodes!!! */
- static struct Node *
- GetNode(struct List *lh, UWORD n)
- {
- struct Node *ln;
-
- for (ln = lh->lh_Head; n--; ln = ln->ln_Succ)
- ;
- return ln;
- }
-
- /* get number of node in list - node MUST be there! */
- static UWORD
- GetNodeNum(struct List *lh, struct Node *node)
- {
- struct Node *ln;
- UWORD i;
-
- for (i = 0, ln = lh->lh_Head; ln != node; ln = ln->ln_Succ, i++)
- ;
- return i;
- }
-
- /* initialise individual gadget in hotkey window */
- static void __regargs
- InitHotKeyGadget(UWORD num, LONG tagtype, LONG tagvalue)
- {
- GT_SetGadgetAttrs(HotKeyGadgets[num], HotKeyWnd, NULL, tagtype, tagvalue, TAG_DONE);
- }
-
- /* initialise all gadgets of hotkey window */
- static void
- InitHotKeyGadgets(void)
- {
- InitHotKeyGadget(GDX_Hotkeys, GTLV_Labels, (LONG)keylist(curtype));
- InitHotKeyGadget(GDX_Actions, GTLV_Selected, curtype);
-
- InitHotKeyGadget(GDX_Delete, GA_Disabled, !curhk);
- InitHotKeyGadget(GDX_HKStr, GA_Disabled, !curhk);
-
- /* something selected */
- if (curhk)
- {
- UWORD n = GetNodeNum(keylist(curtype), (struct Node *)curhk);
-
- if (YHK_Has_Options(curhk))
- {
- InitHotKeyGadget(GDX_Options, GA_Disabled, FALSE);
- InitHotKeyGadget(GDX_Options, GTCY_Active, (LONG)curhk->yhk_Options);
- }
-
- if (YHK_Takes_Arg(curhk))
- {
- InitHotKeyGadget(GDX_Argument, GA_Disabled, FALSE);
- InitHotKeyGadget(GDX_Argument, GTST_String, (LONG)curhk->yhk_ArgStr);
- }
-
- InitHotKeyGadget(GDX_Hotkeys, GTLV_Selected, n);
- InitHotKeyGadget(GDX_Hotkeys, GTLV_Top, n);
- InitHotKeyGadget(GDX_HKStr, GTST_String, (LONG)curhk->yhk_KeyDef);
- }
- else /* no current hotkey */
- {
- InitHotKeyGadget(GDX_HKStr, GTST_String, (LONG)"");
- InitHotKeyGadget(GDX_Options, GTCY_Active, 0);
- InitHotKeyGadget(GDX_Argument, GTST_String, (LONG)"");
-
- InitHotKeyGadget(GDX_Argument, GA_Disabled, TRUE);
- InitHotKeyGadget(GDX_Options, GA_Disabled, TRUE);
- }
- }
-
-
-
- /* handle hotkey window events */
- static LONG
- HandleHotKeyIDCMP(void)
- {
- struct IntuiMessage *msg;
- struct Gadget *gadget;
- ULONG class;
- UWORD code;
-
- while (msg = GT_GetIMsg(HotKeyWnd->UserPort))
- {
- class = msg->Class;
- code = msg->Code;
- gadget = (struct Gadget *)msg->IAddress;
- GT_ReplyIMsg(msg);
-
- switch (class)
- {
- case CLOSEWINDOW:
- HideWindow();
- return HELP_OKAY;
-
- case GADGETUP:
- case GADGETDOWN:
- switch (gadget->GadgetID)
- {
- case GD_Hotkeys:
- curhk = (YakHotKey *)GetNode(keylist(curtype), code);
- InitHotKeyGadgets();
- ActivateGadget(HotKeyGadgets[GDX_HKStr], HotKeyWnd, NULL);
- break;
-
- case GD_HKStr:
- if (!curhk) /* shouldn't happen */
- break;
- if (ModifyYHKKeyDef(curhk, GetString(gadget)))
- {
- InitHotKeyGadget(GDX_Hotkeys, GTLV_Labels, (LONG)keylist(curtype));
- if (YHK_Takes_Arg(curhk))
- ActivateGadget(HotKeyGadgets[GDX_Argument], HotKeyWnd, NULL);
-
- }
- else
- {
- InitHotKeyGadgets();
- ActivateGadget(HotKeyGadgets[GDX_HKStr], HotKeyWnd, NULL);
- }
- break;
-
- case GD_Argument:
- if (!curhk) /* shouldn't happen */
- break;
- if (!(ModifyYHKArgStr(curhk, GetString(gadget))))
- InitHotKeyGadgets();
- break;
-
- case GD_Actions:
- if (code != curtype)
- {
- curtype = code;
- curhk = NULL;
- InitHotKeyGadgets();
- }
- break;
-
- case GD_Options:
- if (curhk)
- curhk->yhk_Options = code;
- break;
-
- case GD_Add:
- curhk = NewYakHotKey(curtype);
- InitHotKeyGadgets();
- ActivateGadget(HotKeyGadgets[GDX_HKStr], HotKeyWnd, NULL);
- break;
-
- case GD_Delete:
- if (curhk)
- {
- DeleteYakHotKey(curhk);
- curhk = NULL;
- InitHotKeyGadgets();
- }
- break;
-
- case GD_Return:
- curhk = NULL; /* in case of reloading */
- UpdateWindowsPosition();
- CloseHotKeyWindow();
- if (!ShowHelpWindow())
- PostError(getString(Couldnt_open_other_window_ERR));
- return HELP_OKAY;
-
- } /* switch (gadget->GadgetID) */
- break;
-
- case REFRESHWINDOW:
- GT_BeginRefresh(HotKeyWnd);
- GT_EndRefresh(HotKeyWnd, TRUE);
- break;
-
- } /* switch (class) */
-
- } /* while more messages */
-
- return HELP_OKAY;
- }
-
-
- /* initialise individual gadget in misc window */
- static void __regargs
- InitMiscGadget(UWORD num, LONG tagtype, LONG tagvalue)
- {
- GT_SetGadgetAttrs(MiscGadgets[num], MiscWnd, NULL, tagtype, tagvalue, TAG_DONE);
- }
-
- /* initialise all gadgets of Misc window */
- static void
- InitMiscGadgets(void)
- {
- InitMiscGadget(GDX_MBMethod, GTCY_Active, mouseblank);
- InitMiscGadget(GDX_ClickVol, GTIN_Number, click_volume);
- InitMiscGadget(GDX_AutoPointDelay, GTIN_Number, autopoint_delay);
- }
-
-
- /* handle Misc window events */
- static LONG
- HandleMiscIDCMP(void)
- {
- struct IntuiMessage *msg;
- struct Gadget *gadget;
- ULONG class;
- UWORD code;
- LONG num;
-
- while (msg = GT_GetIMsg(MiscWnd->UserPort))
- {
- class = msg->Class;
- code = msg->Code;
- gadget = (struct Gadget *)msg->IAddress;
- GT_ReplyIMsg(msg);
-
- switch (class)
- {
- case CLOSEWINDOW:
- HideWindow();
- return HELP_OKAY;
-
- case GADGETUP:
- case GADGETDOWN:
- switch (gadget->GadgetID)
- {
- case GD_Return2:
- UpdateWindowsPosition();
- CloseMiscWindow();
- if (!ShowHelpWindow())
- PostError(getString(Couldnt_open_other_window_ERR));
- return HELP_OKAY;
-
- case GD_ClickVol:
- num = GetNumber(gadget);
- if (num >= 0 && num <= 64) {
- click_volume = num;
- } else {
- InitHelpGadget(GDX_ClickVol, GTIN_Number, click_volume);
- DisplayBeep(HelpWnd->WScreen);
- }
- break;
-
- case GD_AutoPointDelay:
- num = GetNumber(gadget);
- if (num >= 0 && num <= 5) {
- autopoint_delay = num;
- } else {
- InitHelpGadget(GDX_AutoPointDelay, GTIN_Number, autopoint_delay);
- DisplayBeep(MiscWnd->WScreen);
- }
- break;
-
-
- case GD_MBMethod:
- mouseblank = code;
- mblankcount = mblanktimeout;
- break;
-
- } /* switch (gadget->GadgetID) */
- break;
-
- case REFRESHWINDOW:
- GT_BeginRefresh(MiscWnd);
- GT_EndRefresh(MiscWnd, TRUE);
- break;
-
- } /* switch (class) */
-
- } /* while more messages */
-
- return HELP_OKAY;
- }
-
-